package futbol.tacticas.concursantes.TacticaCaccy;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.Vector;

import futbol.Bola;
import futbol.Futbol;
import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoTiroAPuerta;

public class AttSkills extends Skills {

	//private static Logger log = Logger.getLogger(AttSkills.class);
	
	double distanciaCritica;
	double yBola;
	double xBola;
	Point2D.Double porteriaContraria;

	private final int min;
	private final int max;
	
	public AttSkills(int num,int yMin,int yMax,int fuerza,Manager tecnico)
	{
		super(num,160,(yMin+yMax)/2,fuerza,tecnico,null);
		min = yMin;
		max = yMax;
		
		porteriaContraria = new Point2D.Double(160,0);
		distanciaCritica = FutbolTools.getDistanciaCritica(fuerza);
	}
	@Override
	public Vector<Comando> getComandos()
	{
		Ball pelota;
		ArrayList<Ball> tray;
		Vector<Comando> comandos = new Vector<Comando>();

		tray = tecnico.getTrayectoria();
		pelota = tecnico.getPelotaAInterceptarTemporal(tray,this,velocidad,10);
		
		if(pelota.distance(porteriaContraria) < distanciaCritica+10 && pelota != tray.get(tray.size()-1) ) // 20% extra
		{
			
			comandos.add( new ComandoIrA(numero,pelota.x,pelota.y));
			
		}
		else
		{
			pelota = tecnico.getBola();
			yBola = Manager.trim(pelota.getY(), min, max);
			
			comandos.add( new ComandoIrA(numero,getXRespectandoDistancia(yBola),yBola) );
			
		}
		
		pelota = tecnico.getBola();
		if(pelota.distance(this) <= 10)
		{
			
			if(pelota.distance(porteriaContraria) <= distanciaCritica)
			{
				comandos.add( new ComandoTiroAPuerta(numero,0) );
				//log.debug(numero + " - tir a porta");
			}
			else
			{
				
				//log.debug(numero + " - toques");
				
				Point2D.Double p;
				double[] posicion = new double[2];
				
				
				posicion = 	tecnico.irHaciaConEvasion(	this,
														tecnico.getRutasLibres(this, this.distance(porteriaContraria), porteriaContraria),
														porteriaContraria);
				
				if(posicion!=null)
				{
					comandos.add(new ComandoIrA(numero, posicion[0], posicion[1]));
					
					p = tecnico.getPosicionDeToque(posicion[0],posicion[1],pelota,1);
					double[] puntoPreciso = FutbolTools.toquePreciso(this, pelota.getCopia(), p.x, p.y);
					
					comandos.add(new ComandoGolpearBola(numero, puntoPreciso[0], puntoPreciso[1]));
					
				}
				else
				{
					comandos.add( new ComandoTiroAPuerta(numero,0) );
				}
			}
		}
		
		return comandos;
	}
	private int getXRespectandoDistancia(double Y)
	{
		return (int) Math.round( 160 + (distanciaCritica-10)*Math.cos( Math.PI - Math.asin(Y/(distanciaCritica-10)) ) );
		
		
	}
	

}
